package com.xdf.whiteaccount.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class DatetimeUtils {

    /**
     * 获取当前系统时间的小时(HH)
     *
     * @return int 当前系统小时HH格式
     * @throws Exception
     */
    public static int getHH() throws Exception {
        DateFormat df = new SimpleDateFormat("HH");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return Integer.parseInt(str);
    }

    /**
     * 获取当前系统时间的分钟数(mm)
     *
     * @return int 当前系统分钟mm格式
     * @throws Exception
     */
    public static int getMM() throws Exception {
        DateFormat df = new SimpleDateFormat("mm");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        // return Integer.parseInt(str.split(":")[0]) * 4 +
        // Integer.parseInt(str.split(":")[1]) / 15;
        return Integer.parseInt(str);
    }

    /**
     * 获取当前系统时间的秒数(ss)
     *
     * @return int 当前系统时间的秒数(ss)
     * @throws Exception
     */
    public static int getSS() throws Exception {
        DateFormat df = new SimpleDateFormat("ss");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        // return Integer.parseInt(str.split(":")[0]) * 4 +
        // Integer.parseInt(str.split(":")[1]) / 15;
        return Integer.parseInt(str);
    }

    /**
     * 获取输入日期的前后日期
     *
     * @param date    基准日期 yyyy-MM-dd
     * @param dayMark +代表往后,-代表往前
     * @return String 前后日期（yyyy-MM-dd）
     * @throws Exception
     */
    public static String getOtherDay(String date, int dayMark) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.DAY_OF_MONTH, dayMark);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在周的第一天(周一)
     *
     * @param date 基准日期yyyy
     *             -MM-dd
     * @return String 周一（yyyy-MM-dd）
     * @throws Exception
     */
    public static String getWeekFirstDate(String date) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int days = c.get(Calendar.DAY_OF_WEEK);
        String strStart = "";
        if (days == 1) {
            strStart = getOtherDay(date, -days - 5);
        } else {
            strStart = getOtherDay(date, -days + 2);
        }
        return strStart;
    }

    /**
     * 获取日期所在周的最后一天（周日）
     *
     * @param date 基准日期yyyy
     *             -MM-dd
     * @return String（yyyy-MM-dd）
     * @throws Exception
     */
    public static String getWeekLastDate(String date) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int days = c.get(Calendar.DAY_OF_WEEK);
        String strStart = "";
        if (days == 1) {
            strStart = getOtherDay(date, 0);
        } else {
            strStart = getOtherDay(date, 8 - days);
        }
        return strStart;
    }

    /**
     * 获取日期所在周（年的周数）的前后周的周一
     *
     * @param date     基准日期yyyy
     *                 -MM-dd
     * @param weekMark 找基准日期
     *                 +代表往后,-代表往前
     * @return String 前后周的周一（yyyy-MM-dd）
     * @throws Exception
     */
    public static String getOtherWeekFirstDate(String date, int weekMark)
            throws Exception {
        String firstDate = getWeekFirstDate(date);
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(firstDate);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.WEEK_OF_YEAR, weekMark);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在季的第一天
     *
     * @param date 基准日期yyyy
     *             -MM-dd
     * @return String
     * @throws Exception
     */
    public static String getSeasonFirstDate(String date) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        if (month < 3) {
            month = 0;
        } else if (month >= 3 && month < 6) {
            month = 3;
        } else if (month >= 6 && month < 9) {
            month = 6;
        } else if (month >= 9 && month < 12) {
            month = 9;
        }
        c.set(year, month, 1);

        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在季的前后季度的第一天（xxxx-xx-01）
     *
     * @param date       基准日期yyyy-MM-dd
     * @param seasonMark 找基准日期+代表往后,-代表往前
     * @return String
     * @throws Exception
     */
    public static String getOtherSeasonFirstDate(String date, int seasonMark)
            throws Exception {
        String firstDate = getSeasonFirstDate(date);
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(firstDate);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int month = seasonMark * 3;
        if (month != 0) {
            c.add(Calendar.MONTH, month);
        }
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在月的第一天 date基准日期
     *
     * @param date yyyy-MM-dd
     * @return String （yyyy-MM）
     * @throws Exception
     */
    public static String getMonthFirstDate(String date) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        c.set(year, month, 1);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在月的最后一天
     *
     * @param date 基准日期yyyy
     *             -MM-dd
     * @return String yyyy-MM-dd
     * @throws Exception
     */
    public static String getMonthLastDate(String date) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int dayNum = c.getActualMaximum(Calendar.DAY_OF_MONTH);
        c.set(year, month, dayNum);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在月的前后月份的第一天（yyyy-MM-01）
     *
     * @param date      基准日期yyyy
     *                  -MM-dd
     * @param monthMark 找基准日期
     *                  +代表往后,-代表往前
     * @return String
     * @throws Exception
     */
    public static String getOtherMonthFirstDate(String date, int monthMark)
            throws Exception {
        String firstDate = getMonthFirstDate(date);
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(firstDate);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.MONTH, monthMark);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在年的第一天
     *
     * @param date 基准日期yyyy
     *             -MM-dd
     * @return String
     * @throws Exception
     */
    public static String getYearFirstDate(String date) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int year = c.get(Calendar.YEAR);
        c.set(year, 0, 1);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 10);
        return strStart;
    }

    /**
     * 获取日期所在年的前后年的第一天（yyyy-01-01）
     *
     * @param date     基准日期yyyy-MM-dd
     * @param yearMark 找基准日期+代表往后,-代表往前
     * @return String
     * @throws Exception
     */
    public static String getOtherYearFirstDate(String date, int yearMark)
            throws Exception {
        String firstDate = getMonthFirstDate(date);
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(firstDate);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.YEAR, yearMark);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime.substring(0, 4);
        return strStart + "-01-01";
    }

    /**
     * 取得同期日期 年同期
     *
     * @param date yyyy-MM-dd
     * @param year 年份
     * @return 年同期日期yyyy-MM-dd
     * @throws Exception
     */
    public static String getYearTqDay(String date, int year) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.YEAR, year);
        String mDateTime = df.format(c.getTime());
        return mDateTime;
    }

    /**
     * 取得同期日期 月同期
     *
     * @param date  yyyy-MM-dd
     * @param month 月份
     * @return 月同期日期yyyy-MM-dd
     * @throws Exception
     */
    public static String getMonthTqDay(String date, int month) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.MONTH, month);
        String mDateTime = df.format(c.getTime());
        return mDateTime;
    }

    /**
     * 取得同比月份
     *
     * @param month 月份
     * @return 同比月份
     * @throws Exception
     */
    public static String getTbMonth(String month) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM");
        Date dt = df.parse(month);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.YEAR, -1);
        String mDateTime = df.format(c.getTime());
        return mDateTime;
    }

    /**
     * 取得环比月份
     *
     * @param month 月份
     * @return 环比月份
     * @throws Exception
     */
    public static String getHbMonth(String month) throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM");
        Date dt = df.parse(month);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.MONTH, -1);
        String mDateTime = df.format(c.getTime());
        return mDateTime;
    }

    /**
     * 获取两个日期之间的天数
     *
     * @param sDate -- 起始日期yyyy-MM-dd
     * @param eDate -- 结束日期yyyy-MM-dd
     * @return int--天数
     * @throws Exception
     */
    public static int getDaysOfTwoDate(String sDate, String eDate)
            throws Exception {

        DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = df1.parse(sDate);
        Date date2 = df2.parse(eDate);
        if (null == date1 || null == date2) {
            return -1;
        }
        long intervalMilli = date2.getTime() - date1.getTime();
        return (int) (intervalMilli / (24 * 60 * 60 * 1000));
    }

    /**
     * 获取两个月份之间的月数
     *
     * @param sDate -- 起始月yyyy-MM
     * @param eDate -- 结束月yyyy-MM
     * @return int--天数
     * @throws Exception
     */
    public static int getMonthOfTwoMonth(String sDate, String eDate)
            throws Exception {

        DateFormat df = new SimpleDateFormat("yyyy-MM");

        Date date1 = df.parse(sDate);
        Date date2 = df.parse(eDate);
        if (null == date1 || null == date2) {
            return -1;
        }

        Calendar c1 = Calendar.getInstance();
        c1.setTime(date1);
        Calendar c2 = Calendar.getInstance();
        c2.setTime(date2);

        int month1 = c1.get(Calendar.YEAR) * 12 + c1.get(Calendar.MONTH);
        int month2 = c2.get(Calendar.YEAR) * 12 + c2.get(Calendar.MONTH);

        return month2 - month1;
    }

    /**
     * 比较两个日期
     *
     * @param sDate   起始日期
     * @param eDate   结束日期
     * @param pattern 日期格式
     * @return boolean 返回比较结果
     * @throws Exception
     */
    public static boolean compareDate(String sDate, String eDate, String pattern)
            throws Exception {

        DateFormat df1 = new SimpleDateFormat(pattern);
        Date date1 = df1.parse(sDate);
        Date date2 = df1.parse(eDate);
        if (null == date1 || null == date2) {
            return false;
        }
        long intervalMilli = date2.getTime() - date1.getTime();
        if (intervalMilli > 0) {
            return true;
        }
        return false;
    }

    /**
     * 获取两个日期之间的分钟数
     *
     * @param sDate 起始日期 yyyy-MM-dd HH:mm:ss
     * @param eDate 结束日期 yyyy-MM-dd HH:mm:ss
     * @return int--分钟数
     * @throws Exception
     */
    public static int getMinsOfTwoDate(String sDate, String eDate)
            throws Exception {

        DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date1 = df1.parse(sDate);
        Date date2 = df2.parse(eDate);
        if (null == date1 || null == date2) {
            return -1;
        }
        long intervalMilli = date2.getTime() - date1.getTime();
        return (int) (intervalMilli / (60 * 1000));
    }

    /**
     * 获取当前系统时间的字符串
     *
     * @return String -- 当天的整个日期字符串，年月日时分秒，返回格式yyyy-MM-dd HH:mm:ss
     * @throws Exception
     */
    public static String getToDayAllStr() throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return str;
    }

    /**
     * 获取当前系统日期的字符串
     *
     * @return String-- 当天的年月日字符串，返回格式 yyyy-MM-dd
     * @throws Exception
     */
    public static String getToDayDateStr() throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return str;
    }

    /**
     * 获取当前系统日期的字符串
     *
     * @return String -- 当天的年月日字符串，返回格式 yyyyMMdd
     */
    public static String getToDayYmd() throws Exception {
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return str;
    }

    /**
     * 获取当前系统时间的指定类型字符串
     *
     * @param pattern 指定的格式
     * @return String-- 当天的指定类型的字符串
     * @throws Exception
     */
    public static String getToDayStrByPattern(String pattern) throws Exception {
        DateFormat df = new SimpleDateFormat(pattern);
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return str;
    }

    /**
     * 获取当前系统时间的字符串
     *
     * @return String 当天的时分秒字符串，返回格式HH:mm:ss
     */
    public static String getToDayHmsStr() throws Exception {
        DateFormat df = new SimpleDateFormat("HH:mm:ss");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return str;
    }

    /**
     * 获取当前系统时间的字符串
     *
     * @return String -- 当天的时分秒字符串，返回格式HHmmss
     */
    public static String getToDayHms() throws Exception {
        DateFormat df = new SimpleDateFormat("HHmmss");
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return str;
    }

    /**
     * 获取当前系统指定格式的时间的字符串
     *
     * @param pattern 指定格式
     * @return String 当前系统指定格式时间字符串
     * @throws Exception
     */
    public static String getToDayHmsByPattern(String pattern) throws Exception {
        DateFormat df = new SimpleDateFormat(pattern);
        Date date = new Date(System.currentTimeMillis());
        String str = df.format(date);
        return str;
    }

    /**
     * 获取指定日期的时刻字符串
     *
     * @param dayStr (yyyy-MM-dd HH:mm:ss)
     * @return String -- 当天的时分秒字符串，返回格式：HHmmss
     */
    public static String getHmsStrForDateTime(String dayStr) throws Exception {
        DateFormat df = new SimpleDateFormat("HHmmss");
        DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = df.format(df2.parse(dayStr));
        return str;
    }

    /**
     * 日期格式转换 oldPattern 转成 newPattern
     *
     * @param str        要转换格式的日期字符串
     * @param oldPattern 原有格式
     * @param newPattern 目标格式
     * @return String转换格式化后的字符串
     * @throws Exception
     */
    public static String changeDateType(String str, String oldPattern, String newPattern) throws Exception {
        DateFormat df = new SimpleDateFormat(oldPattern);
        DateFormat df1 = new SimpleDateFormat(newPattern);
        return df1.format(df.parse(str));
    }


    /**
     * 获取输入日期的前后几小时的日期时间
     *
     * @param date    基准日期yyyy-MM-dd HH:mm:ss
     * @param dayMark 找基准日期
     *                +代表往后,-代表往前
     * @return
     * @throws Exception
     */
    public static String getOtherHour(String date, int dayMark)
            throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.HOUR_OF_DAY, dayMark);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime;
        return strStart;
    }

    /**
     * 获取前后分钟数
     *
     * @param date       yyyy-MM-dd HH:mm:ss
     * @param minuteMark 前后标识+-数值
     * @return 返回
     * @throws Exception
     */
    public static String getOtherMinute(String date, int minuteMark)
            throws Exception {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = df.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(Calendar.MINUTE, minuteMark);
        String mDateTime = df.format(c.getTime());
        String strStart = mDateTime;
        return strStart;
    }


    /**
     * 解析字符串为Date类型
     *
     * @param date    要被解析的日期字符串
     * @param pattern 类型格式，默认yyyy-MM-dd HH:mm:ss
     * @return Date 被解析后的日期
     * @throws Exception
     */
    public static Date parseDate(String date, String pattern) throws Exception {
        Date returnDate = null;
        if (pattern == null || pattern.equals("") || pattern.equals("null")) {
            pattern = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            returnDate = sdf.parse(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return returnDate;
    }

    /**
     * 将字符串类型的日期转换为日期时间类型
     *
     * @param date 字符串类型的日期
     * @return 返回 Date 类型的日期
     * @throws Exception
     */
    public static Date parseDate(String date) throws Exception {
        Date returnDate = null;
        String pattern = "yyyy-MM-dd HH:mm:ss";

        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            returnDate = sdf.parse(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return returnDate;
    }


    /**
     * 格式化Date类型日期
     *
     * @param date    Date类型日期
     * @param pattern 类型格式
     * @return String，被格式化后的日期
     * @throws Exception
     */
    public static String formatDate(Date date, String pattern) {
        String returnDate = null;

        if (date == null) {
            return "";
        }

        if (pattern == null || pattern.equals("") || pattern.equals("null")) {
            pattern = "yyyy-MM-dd HH:mm:ss";
        }

        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        returnDate = sdf.format(date);

        return returnDate;
    }

    public static String formatDate(Date date) {
        String ret = formatDate(date, "yyyy-MM-dd HH:mm:ss");
        return ret;
    }

    public static String getNowDatetime(){
        return formatDate(new Date());
    }

    public static String formatDate(long time) throws Exception {
        return formatDate(new Date(time), "yyyy-MM-dd HH:mm:ss");
    }

    public static String formatDateTZ8(long time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        return sdf.format(new Date(time));
    }

    public static String formatNow() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        return sdf.format(new Date());
    }

    public static Date getNowTZ() throws Exception {
        Date now = parseDate(formatNow());
        return now;
    }


    /**
     * 得到当前月份yyyy-MM；
     *
     * @return String
     */
    public static String getSystemMonth() {
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
        String mDateTime1 = formatter.format(date);
        return mDateTime1;
    }

    /**
     * 获取月所在年的最后一个月
     *
     * @param month 月份
     * @param m
     * @return
     * @throws Exception
     */
    public static String getYearLastMonth(String month, int m) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");

        Date newDate = new Date();
        newDate = format.parse(month);
        Calendar c = Calendar.getInstance();
        c.setTime(newDate);
        c.add(Calendar.YEAR, m);

        newDate.setTime(c.getTimeInMillis());

        return format.format(newDate).substring(0, 4) + "-12";
    }

    /**
     * 获取前后月份
     * + 往后推迟m月
     *
     * @param month
     * @param m
     * @return
     * @throws Exception
     */
    public static String getOtherMonth(String month, int m) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");

        Date newDate = new Date();
        newDate = format.parse(month);
        Calendar c = Calendar.getInstance();
        c.setTime(newDate);
        c.add(Calendar.MONTH, m);

        newDate.setTime(c.getTimeInMillis());

        return format.format(newDate);
    }

    /**
     * 获取前后月份+ 往后推迟m月
     *
     * @param month
     * @param m
     * @return
     * @throws Exception
     */
    public static String getOtherMonthYMD(String month, int m) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        Date newDate = new Date();
        newDate = format.parse(month);
        Calendar c = Calendar.getInstance();
        c.setTime(newDate);
        c.add(Calendar.MONTH, m);

        newDate.setTime(c.getTimeInMillis());

        return format.format(newDate);
    }

    /**
     * 根据年月字符串得到那个月的总天数
     *
     * @param monthStr yyyy-MM
     * @return int 总天数
     * @throws Exception
     */
    public static int getDaysOfMonth(String monthStr) throws Exception {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
        Date date = format.parse(monthStr);
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        int dayNum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        return dayNum;
    }

    /**
     * 获取指定时刻前后指定步长的时刻
     *
     * @param time 时刻HH:mm:ss
     * @param m    步长(+-m) 0:输出原来的时刻，+1输出后一个时刻，-1输出前一个时刻
     * @return String HH:mm:ss
     * @throws Exception
     */
    public static String getBeforeAfterTimeForMin(String time, int m)
            throws Exception {
        Calendar now = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
        Date newDate = new Date();
        newDate = format.parse(time);
        now.setTime(newDate);
        now.add(Calendar.MINUTE, m);
        return format.format(now.getTime());
    }

    /**
     * 获取指定格式的前后时间
     *
     * @param time
     * @param m       (0:输出原来的时刻，+1输出后一个时刻，-1输出前一个时刻)
     * @param pattern 类型的格式必须被time的格式所包含
     * @return
     * @throws Exception
     */
    public static String getBeforeAfterDateTimeByTime(String time, int m,
                                                      String pattern) throws Exception {
        Calendar now = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);

        Date newDate = new Date();
        newDate = sdf.parse(time);
        now.setTime(newDate);
        now.add(Calendar.MINUTE, m);

        return sdf.format(now.getTime());
    }

    /**
     * 在当前时间的基础上增减时间
     *
     * @param type   类似 Calendar.MINUTE
     * @param amount
     * @return
     */
    public static Date add(int type, int amount) {
        Calendar now = Calendar.getInstance();
        now.add(type, amount);
        return now.getTime();
    }

    /**
     * 使用传入参数和今天比较是否在同一天，是则返回true
     *
     * @param stdDate
     * @return
     */
    public static boolean isSameDay(String stdDate) {
        LocalDate stdDay = string2LocalDate(stdDate, "");
        int iDay = stdDay.getDayOfMonth();
        int nowDay = LocalDate.now().getDayOfMonth();
        return iDay == nowDay ? true : false;
    }

    public static boolean isSameDay(Date date){
        if( date == null ) return false;
        if( new Date().getDay() == date.getDay())
            return true;
        else
            return false;
    }

    public static boolean isSameMonth(Date date) {
        if( new Date().getMonth() == date.getMonth() )
            return true;
        else
            return false;
    }

    public static boolean isSameYear(Date date) {
        if( new Date().getYear() == date.getYear() )
            return true;
        else
            return false;
    }

    public static boolean isSameMonth(String stdDate) {
        LocalDate stdDay = string2LocalDate(stdDate, "");
        int iDay = stdDay.getMonthValue();
        int nowDay = LocalDate.now().getMonthValue();
        return iDay == nowDay ? true : false;
    }

    public static boolean isSameYear(String stdDate) {
        LocalDate stdDay = string2LocalDate(stdDate, "");
        int iDay = stdDay.getYear();
        int nowDay = LocalDate.now().getYear();
        return iDay == nowDay ? true : false;
    }


    public static LocalDate string2LocalDate(String strDate, String format) {
        if (format.length() <= 0) format = "yyyy-MM-dd";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
        LocalDate localDate = LocalDate.parse(strDate, dtf);
        return localDate;
    }

    public static LocalDateTime string2LocalDateTime(String strDate, String format) {
        if (format.length() <= 0) format = "yyyy-MM-dd HH:mm:ss";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
        LocalDateTime localDateTime = LocalDateTime.parse(strDate, dtf);
        return localDateTime;
    }

    /**
     * 传入一个日期，转换为当天的零点
     * @param day
     * @return
     */
    public static Date getDayStart(Date day){
        day.setHours(0);
        day.setMinutes(0);
        day.setSeconds(0);

        return day;
    }

    /**
     * 传入一个日期，返回当天的最后一秒的时间
     * @param day
     * @return
     */
    public static Date getDayEnd(Date day){
        day.setHours(23);
        day.setMinutes(59);
        day.setSeconds(59);
        return day;
    }

    /**
     * 判断两个日期是否是同一天，不计算时间
     * @param date1
     * @param date2
     * @return
     */
    public static Boolean isSameDate(Date date1,Date date2){
        if( date1.getYear() != date2.getYear() ) return false;
        if( date1.getMonth() != date2.getMonth() ) return false;
        if( date1.getDay() != date2.getDay() ) return false;
        return true;
    }

    public static boolean isToday(Date date){
        if( date == null ) return false;
        if( new Date().getDay() == date.getDay())
            return true;
        else
            return false;
    }

    public static boolean isThisMonth(Date date) {
        if( new Date().getMonth() == date.getMonth() )
            return true;
        else
            return false;
    }

    public static boolean isThisYear(Date date) {
        if( new Date().getYear() == date.getYear() )
            return true;
        else
            return false;
    }

}